#include <stdio.h>
#include "malloc.h"
#define QUEUE_MAX_SIZE 100

typedef struct Queue{
    int elements[QUEUE_MAX_SIZE];//分配空间
    int front;//头指针
    int rear;//尾指针
    int size;

} Queue;//没有加* 不是指针类型，普通类型。在引用时用.而不是->。

// 初始化队列。初始化成功返回0；初始化失败返回1。
int init_queue(Queue ** q)
{
    (*q) = malloc(sizeof(Queue));
    if (*q != NULL){
        return 0;
    }
    else if (*q = NULL){
        return 1;
    }
}
// 在队列q的尾巴上增加一个元素，其值为value。增加成功，返回0；增加失败，返回1;
int enqueue (Queue * q, int value){
if ((q->rear+1)%QUEUE_MAX_SIZE== q->front)
    return 1;
q-> elements [q->rear] = value;
q->rear=(q->rear+1)%QUEUE_MAX_SIZE;
    return 0;

}
// 从队列q上摘取（去掉）一个元素，将其值放入value中。摘取成功，返回0；摘取失败，返回1。
int dequeue(Queue * q, int *value){
    if(q->front==q->rear)
        return 1;
    *value = q->elements[q->front];
    q->front=(q->front+1)%QUEUE_MAX_SIZE;
    return 0;

}

// 获取队列q的第一个元素，但是并不去掉该元素，并将该值放入value中。获取成功返回0；获取失败，返回1。
int first(Queue * q, int * value){
    if(q->front!=q->rear)
        return q->elements[q->front];
}

// 判断队列q是否为空。为空，返回0；不为空，返回1。
int is_empty(Queue * q){
    if (q->front==q->rear && q->front== 0)
        return 0;
    else return 1;

}

// 返回队列q中的元素个数。
int size(Queue * q){
    return (q->rear-q->front+QUEUE_MAX_SIZE)%QUEUE_MAX_SIZE;
}
//int DestroyQueue(Queue q){}

int main (){
    Queue *q;
    int *value;

    init_queue(&q);
    {
        for (int i = 0; i < 10; i++) {
            value = i;
            enqueue(&q,*value);
        }
        dequeue(&q,*value);
        printf("dequeue:%d",*value);
        first(&q,*value);
        printf("first:%d",*value);
        printf("the queue is empty? %d", is_empty(q));

        printf("the length is:%d"), size(q);
    }

}